% makeTruthTable (n)
% ==================
% Crea una matriz 'table' de pruebas, que en conjunto se la
% denomica 'epoca' cada fila representa una prueba para una 
% 'neurona' de perseptron simple

% Se preprosesan los valores:
% los valores de verdad son 1 y -1 siendo -1 falso, y 1 verdadero

% Parametros:
% n - representa la cantidad de entradas de la neurona, 
% su dimension

% NOTAS:
% (*) Los indices en Octave comienzan desde 1 !!!
% (*) Antes de acceder una variable global hay que declararla 
% dentro de las funciones que la van a modificar


function answer=makeTruthTable(n, problem)
    global table;
	
    if n>=2 && n <=5
            level=2^n;
            if(strcmp(problem,'or') == 1)
                table=-1*ones(level,n+1);
            elseif(strcmp(problem,'and') == 1)
                table=ones(level,n+1);
            else
                error('func must be ''and'' or ''or''');
            end    
            complete(level,n,problem);
	else
		error('n must be a value between 2 and 5');
    end
    answer = table;
end

	
function complete(level,n,problem)
	recu(1,level,1,0);
	evaluate(level,n,problem);
end

function recu(val,l,i,j)
    global table;
	
    if l==1
		table(i,j)=val;
	else
		nextl=l/2;
		recu(val,nextl,i,j+1);
		recu(-val,nextl,i+nextl,j+1);
		completecolumn(val,l,i,j);	
    end
end

function completecolumn(val,l,i,j)
    global table;
	
    if j~=0
		table(i,j)=val;
    end
    
    if l>1
		completecolumn(val,l-1,i+1,j);
    end
end

function evaluate(level,n,problem)
	global table;
	
    for i=1:level
		
        for  j=1:n
			
            if(strcmp(problem, 'or') == 1)
                if table(i,j)==1
                    table(i,n+1)=1;
                end    
            else
                if table(i,j)==-1
                    table(i,n+1)=-1;
                end
            end
        end
    end
end
